package cn.cdeden.resource.service;

import cn.cdeden.common.oss.entity.UploadResult;
import cn.cdeden.common.oss.enumd.OssModuleType;
import cn.cdeden.resource.domain.SysOss;
import cn.cdeden.system.api.model.LoginUser;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletResponse;
import cn.cdeden.common.mybatis.core.page.PageQuery;
import cn.cdeden.common.core.utils.page.TableDataInfo;
import cn.cdeden.resource.domain.bo.SysOssBo;
import cn.cdeden.resource.domain.vo.SysOssVo;

import java.io.IOException;
import java.util.Collection;
import java.util.List;

/**
 * 文件上传 服务层
 *
 * @author Lion Li
 */
public interface ISysOssService extends IService<SysOss> {

    /**
     * 查询OSS对象存储列表
     *
     * @param sysOss    OSS对象存储分页查询对象
     * @param pageQuery 分页查询实体类
     * @return 结果
     */
    TableDataInfo<SysOssVo> queryPageList(SysOssBo sysOss, PageQuery pageQuery);

    /**
     * 根据一组 ossIds 获取对应的 SysOssVo 列表
     *
     * @param ossIds 一组文件在数据库中的唯一标识集合
     * @return 包含 SysOssVo 对象的列表
     */
    List<SysOssVo> listByIdList(Collection<Long> ossIds);

    /**
     * 根据一组 ossIds 获取对应文件的 URL 列表
     *
     * @param ossIds 以逗号分隔的 ossId 字符串
     * @return 以逗号分隔的文件 URL 字符串
     */
    String selectUrlByIds(String ossIds);

    /**
     * 通过ossId查询对应的封面的url
     *
     * @param ossIds
     * @return java.lang.String
     * @author Yu.
     * @Date 2025/2/6 14:54
     **/
    String selectImageUrlByIds(String ossIds);

    /**
     * 根据 ossId 从缓存或数据库中获取 SysOssVo 对象
     *
     * @param ossId 文件在数据库中的唯一标识
     * @return SysOssVo 对象，包含文件信息
     */
    SysOssVo getById(Long ossId);

    /**
     * 根据 ossId 和 versionId 从缓存或数据库中获取 SysOssVo 对象
     *
     * @param ossId     文件在数据库中的唯一标识
     * @param versionId 文件的版本号
     * @return SysOssVo 对象，包含文件信息
     */
    SysOssVo getByIdAndVersionId(Long ossId, String versionId);


    /**
     * 根据文件的 URL 获取对应的 SysOssVo 对象
     *
     * @param url
     * @return cn.cdeden.resource.domain.vo.SysOssVo
     * @author Yu.
     * @Date 2024/12/6 15:38
     **/
    SysOssVo getByUrl(String url);


    /**
     * 修改OSS文件的 版本信息
     *
     * @param ossId
     * @param uploadResult //上传的文件信息
     * @param moduleType
     * @param userId       //用户信息 没有传用登录信息 传了用userId
     * @return boolean
     * @author Yu.
     * @Date 2024/12/5 20:14
     **/
    SysOssVo update(Long ossId, UploadResult uploadResult, OssModuleType moduleType, Long userId);




    /**
     * 上传文件 生成结果实体
     *
     * @param fileName
     * @param suffix
     * @param configKey
     * @param uploadResult 上传文件的结果
     * @param moduleType   文件的模块
     * @return cn.cdeden.resource.domain.vo.SysOssVo
     * @author Yu.
     * @Date 2024/12/5 15:00
     **/
    SysOssVo buildResultEntity(String fileName, String suffix, String configKey, UploadResult uploadResult, OssModuleType moduleType);

    /**
     * 上传文件 生成结果实体 手动设置 用户信息
     *
     * @param fileName
     * @param suffix
     * @param configKey
     * @param uploadResult 上传文件的结果
     * @param moduleType   文件的模块
     * @param loginUser    用户信息
     * @return cn.cdeden.resource.domain.vo.SysOssVo
     * @author Yu.
     * @Date 2025/1/2 10:07
     **/
    SysOssVo buildResultEntity(String fileName, String suffix, String configKey, UploadResult uploadResult, OssModuleType moduleType, LoginUser loginUser);

    /**
     * 文件下载方法，支持一次性下载完整文件
     *
     * @param ossId    OSS对象ID
     * @param response HttpServletResponse对象，用于设置响应头和向客户端发送文件内容
     */
    void download(Long ossId, HttpServletResponse response) throws IOException;

    /**
     * 删除OSS对象存储
     *
     * @param ids     OSS对象ID串
     * @param isValid 判断是否需要校验
     * @return 结果
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);


}
